package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import qlsv.Book;
import qlsv.Shelf;
import qlsv.LibRoom;
import db.Database;
@SuppressWarnings("all")
public class BookMS extends JFrame implements ActionListener, TreeSelectionListener, ListSelectionListener{
private final String DB_NAME="lib.db";
private DefaultMutableTreeNode root;
private DefaultTreeModel treeModel;
private JTree tree;
private DefaultListModel dlmBook;
private JList lstBook;
private JTextField tfID,tfTitle,tfAuthor,tfPages;
private JButton btThem,btLuu,btSua,btXoa;
private JButton btAddShelf,btRemShelf;
private LibRoom db=null;//dùng nạp toàn bộ csdl
private Shelf selShelf=null;
public BookMS() {
super("Quản lý thư viện");
addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent arg0) {
//lưu csdl
SaveDB();
//thoat
System.exit(1);
}
});
setSize(600,400);
TaoHeader();
TaoGUI();
LoadDB();
/*db.AddShelf(new Shelf(“s01″,”Tiểu thuyết 3 xu”));
db.AddShelf(new Shelf(“s02″,”Sách Tin học”));
db.AddShelf(new Shelf(“s03″,”Sách Ngoại ngữ”));*/
LockText(true);//không cho sửa
}
/**
* Hàm này thực thi khi bắt đầu chạy chương trình
*/
void LoadDB(){
try {
if(!new File(DB_NAME).exists()){//chưa tồn tại csdl
db=new LibRoom("bien hoa","room001");

}
else{
Database b=new Database();
db=(LibRoom)b.DeserialObject(DB_NAME);
//xây dựng tree
BuildTree();
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Lỗi nạp CSDL");
}
}
/**
* Xây dựng tree dựa trên DB
*/
void BuildTree() {
root.removeAllChildren();
for (int i = 0; i < db.Count(); i++) {
Shelf sf=db.getShelf(i);
root.add(new DefaultMutableTreeNode(sf));
}
tree.updateUI();//cập nhật lên jtree
}
/**
* Chạy khi kết chương trình
* dùng để update dữ liệu xuống file
*/
void SaveDB(){
try {
new Database().SerialObject(db, DB_NAME);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Lỗi lưu CSDL");
}
}
void TaoHeader(){
JLabel lbl=new JLabel("LIBRARY MANAGMENT SYSTEM",JLabel.CENTER);
lbl.setFont(new Font("Arial",Font.BOLD,30));
lbl.setForeground(Color.blue);
this.add(lbl,BorderLayout.NORTH);
}
void TaoGUI(){
//tạo tree
root=new DefaultMutableTreeNode("Lib room");
treeModel=new DefaultTreeModel(root);
tree=new JTree(treeModel);
tree.addTreeSelectionListener(this);
JScrollPane treePane=new JScrollPane(tree);
JPanel pLeft=new JPanel(new BorderLayout());
pLeft.add(treePane,BorderLayout.CENTER);
JPanel pFunc=new JPanel();
pFunc.add(btAddShelf=new JButton("Add Shelf"));
pFunc.add(btRemShelf=new JButton("Remove Shelf"));
btAddShelf.addActionListener(this);
btRemShelf.addActionListener(this);
pLeft.add(pFunc,BorderLayout.SOUTH);
JPanel pCen=new JPanel(new BorderLayout());
JSplitPane spPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,pLeft,pCen);
this.add(spPane,BorderLayout.CENTER);
//Pane details
JPanel pList=new JPanel(new BorderLayout());
JPanel pDetails=new JPanel(new BorderLayout());
pList.setBorder(BorderFactory.createTitledBorder("Book listing…"));
pDetails.setBorder(BorderFactory.createTitledBorder("Selected book informations"));


pCen.add(pList,BorderLayout.CENTER);
pCen.add(pDetails,BorderLayout.SOUTH);
//Them list book
dlmBook=new DefaultListModel();
lstBook=new JList(dlmBook);
pList.add(new JScrollPane(lstBook));
lstBook.setPreferredSize(new Dimension(200,200));
lstBook.addListSelectionListener(this);
//tạo details
Box b=Box.createVerticalBox();
Box b1=Box.createHorizontalBox();
Box b2=Box.createHorizontalBox();
Box b3=Box.createHorizontalBox();
Box b4=Box.createHorizontalBox();
Box b5=Box.createHorizontalBox();
b.add(b1);b.add(Box.createVerticalStrut(7));
b.add(b2);b.add(Box.createVerticalStrut(7));
b.add(b3);b.add(Box.createVerticalStrut(7));
b.add(b4);b.add(Box.createVerticalStrut(7));
b.add(b5);b.add(Box.createVerticalStrut(7));
JLabel l1,l2,l3,l4;
b1.add(l1=new JLabel("Book ID:",JLabel.RIGHT));b1.add(tfID=new JTextField(20));
b2.add(l2=new JLabel("Title",JLabel.RIGHT));b2.add(tfTitle=new JTextField(20));
b3.add(l3=new JLabel("Author:",JLabel.RIGHT));b3.add(tfAuthor=new JTextField(20));
b4.add(l4=new JLabel("No. Pages:",JLabel.RIGHT));b4.add(tfPages=new JTextField(20));
l1.setPreferredSize(l4.getPreferredSize());
l2.setPreferredSize(l4.getPreferredSize());
l3.setPreferredSize(l4.getPreferredSize());
b5.add(btThem=new JButton("Thêm"));btThem.addActionListener(this);
b5.add(btLuu=new JButton("Lưu"));btLuu.addActionListener(this);btLuu.setEnabled(false);
b5.add(btSua=new JButton("Sửa"));btSua.addActionListener(this);
b5.add(btXoa=new JButton("Xóa"));btXoa.addActionListener(this);
pDetails.add(b,BorderLayout.CENTER);
}
private void LockText(boolean status){
tfID.setEditable(!status);
tfPages.setEditable(!status);
tfTitle.setEditable(!status);
tfAuthor.setEditable(!status);
}
@Override
public void actionPerformed(ActionEvent e) {
Object o=e.getSource();
if(o.equals(btAddShelf)) {
String sID=JOptionPane.showInputDialog("Nhập Mã số kệ:");
String sName=JOptionPane.showInputDialog("Nhập tên kệ:");
if(sID==null||sName==null)
return;
if(sID.trim().equals("")||sName.trim().equals("")) {
JOptionPane.showMessageDialog(null, "Cần nhập thông tin đầy đủ mới lưu được");
return;
}
Shelf sf=new Shelf(sID,sName);
if(db.AddShelf(sf)) {
BuildTree();
}
else
JOptionPane.showMessageDialog(null, "Không thêm được kệ sách này");
}
else if(o.equals(btRemShelf)) {
try {
if(selShelf==null) {
JOptionPane.showMessageDialog(null, "Chọn kệ sách cần xóa trước đã");
return;
}
if(JOptionPane.showConfirmDialog(null,
"Bạn chắc chắn xóa cuốn sách này chứ?",
"Xác nhận",JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE)==JOptionPane.YES_OPTION) {
DefaultMutableTreeNode selNode=(DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
root.remove(selNode);
if(db.RemoveShelf(selShelf.getShelfID()))
BuildTree();
}
}catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Không xóa được");
System.out.println(ex);
}
}
else if(o.equals(btThem)){
if(btThem.getText().equalsIgnoreCase("Thêm")){
btThem.setText("Hủy bỏ");
btLuu.setEnabled(true);
btXoa.setEnabled(false);
btSua.setEnabled(false);
LockText(false);
}else{
btThem.setText("Thêm");
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btSua.setEnabled(true);
LockText(true);
}
}
else if(o.equals(btLuu)){
if(tfID.getText().trim().equals("")||
tfTitle.getText().trim().equals("")||
tfAuthor.getText().trim().equals("")||
tfPages.getText().trim().equals("")){
JOptionPane.showMessageDialog(null, "Không được để trốn");
return;
}
int pages=0;
try {
pages = Integer.parseInt(tfPages.getText());
} catch (Exception e1) {
JOptionPane.showMessageDialog(null, "Phải nhập số nguyên vào số trang");
tfPages.selectAll();tfPages.requestFocus();
return;
}
if(btThem.isEnabled()){//nút lưu của nút thêm
Book b=new Book(tfID.getText(),tfTitle.getText(),
tfAuthor.getText(),pages);
if(selShelf!=null){
if(selShelf.AddBook(b)) {
dlmBook.addElement(b);
//khôi phục tình trạng
btThem.setText("Thêm");
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btSua.setEnabled(true);
LockText(true);
}
else
JOptionPane.showMessageDialog(null, "Không thêm được. Trùng khóa");
}
else
JOptionPane.showMessageDialog(null, "Phải chọn kệ trước");
}
else{//nút lưu là của nút sửa
if(selShelf!=null) {
Book b=new Book(tfID.getText(),tfTitle.getText(),
tfAuthor.getText(),Integer.parseInt(tfPages.getText()));
if(!selShelf.UpdateBookInfos(tfID.getText(), b))
JOptionPane.showMessageDialog(null, "Không update được");
else {
BuildList();
btSua.setText("Sửa");
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btThem.setEnabled(true);
LockText(true);
lstBook.setEnabled(true);
tree.setEnabled(true);
}
}
else
JOptionPane.showMessageDialog(null, "Không update được. Chọn kệ trước");
}
}
else if(o.equals(btSua)) {
if(tfID.getText().trim().equals("")) {
JOptionPane.showMessageDialog(null, "Hãy chọn sách cần sửa thông tin trước");
return;
}
if(btSua.getText().equalsIgnoreCase("Sửa")){
btSua.setText("Hủy bỏ");
btLuu.setEnabled(true);
btXoa.setEnabled(false);
btThem.setEnabled(false);
LockText(false);tfID.setEditable(false);
lstBook.setEnabled(false);
tree.setEnabled(false);
}else{
btSua.setText("Sửa");
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btThem.setEnabled(true);
LockText(true);
lstBook.setEnabled(true);
tree.setEnabled(true);
}
}
else if(o.equals(btXoa)) {
String id=tfID.getText();
if(id.trim().equals("")) {
JOptionPane.showMessageDialog(null, "Bạn cần chọn cuốn sách cần gỡ bỏ trước đã");
return;
}
if(JOptionPane.showConfirmDialog(null,
"Bạn chắc chắn xóa cuốn sách này chứ?",
"Xác nhận",JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE)==JOptionPane.YES_OPTION) {
if(!selShelf.RemoveBook(id))
JOptionPane.showMessageDialog(null, "Không xóa được");
else {
BuildList();
}
}
}
}
//khi chọn lên tree sẽ liệt kê các sách của kệ đang chọn
@Override
public void valueChanged(TreeSelectionEvent te) {
try {
DefaultMutableTreeNode selNode=(DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
if(selNode.getLevel()>0) {
selShelf=(Shelf)selNode.getUserObject();
//đưa danh sách các book vào list
BuildList();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private void BuildList() {
dlmBook.clear();
for (int i = 0; i < selShelf.Count(); i++) {
Book b=selShelf.GetBook(i);
dlmBook.addElement(b);
}
}
//Khi chọn lên 1 cuốn sách trong jlist
//sẽ hiển thị thông tin chi tiết trên các textfield
@Override
public void valueChanged(ListSelectionEvent arg0) {
try {
Book selBook=(Book)lstBook.getSelectedValue();
if(selBook!=null) {
tfID.setText(selBook.getBookID());
tfTitle.setText(selBook.getBookTitle());
tfAuthor.setText(selBook.getAuthorName());
tfPages.setText(selBook.getNoPages()+"");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
